今天要來介紹的是表達式~表達式用來做對值的運算,一個表達式包含了變數以及運算符,這在組合邏輯電路和時序邏輯電路的設計裡是重要的部分。
用來執行加減乘除運算。
運算 | 符號 |
---|---|
加 | + |
減 | - |
乘 | * |
除 | / |
取餘數 | % |
以verilog寫入的話:
module expression_example(A,B,C);
input A,B;
output C;
reg result;
initial begin
result = A + B; //加法
//A-B, A*B, A/B, A%B
end
assign C = result;
endmodule
用來比較兩個值,返回結果的type為bool。
關係 | 符號 |
---|---|
等於 | == |
不等於 | != |
小於 | < |
小於等於 | <= |
大於 | > |
大於等於 | >= |
用來執行邏輯運算,返回結果的type為bool。
邏輯 | 符號 |
---|---|
邏輯與 | && |
邏輯或 | || |
邏輯非 | ! |
就是對數值做位移操作。
移動 | 符號 | 說明 |
---|---|---|
邏輯左移 | << | 對值乘上2^n, n = 位移量 |
邏輯右移 | >> | 對值除以2^n, n = 位移量 |
他的結構是:表達式:( a ? b : c )
其中a為條件,條件成立的狀況下會傳回b,不成立則傳回c。
這邊舉個例子:
module newwork(condition,C);
input condition;
output [3:0]C;
reg [3:0]a,b;
reg [3:0]result;
//reg condition;
initial begin
a = 4'b0101;
b = 4'b0011;
result = condition ? a : b;
end
assign C = result;
endmodule
result的值取決於condition,如果condition的值為1,則result的值為a(5);如果condition的值為0,則result的值為b(3),最後再將result傳給C做輸出。
assign的功能之一是賦值到wire(net)型別的訊號。
//assign 基本語法
assign <網路信號> = <表達式>;
//舉例
module expression_example(A,B,C);
input A,B;
output C;
wire a,b,c;
and( a, A, B ); //a = AB
and( b, B, C ); //b = BC
assign c = ~C; //c = C'
endmodule
這邊要稍微注意的是,assign只適用在net型別的訊號,無法用在reg的型別,所以assign的等號左式不能放reg的類別喔!而等號的右式可以為reg或net。
且assign的左式不能包含右式存在的訊號,因為assign不存在記憶性,這點跟C有很大的不同。
a = a + b; //C允許,但verilog不行
這裡再舉一個assign的例子:
module expression_example(A,B,C);
input [3:0] A;
input [3:0] B;
output [3:0] C;
assign C = A + B; //加法
endmodule
今天就到這邊~